<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>481. 神奇字符串</title>
  </head>
  <body>
    <script>
      //     神奇字符串 s 仅由 '1' 和 '2' 组成，并需要遵守下面的规则：

      // 神奇字符串 s 的神奇之处在于，串联字符串中 '1' 和 '2' 的连续出现次数可以生成该字符串。
      // s 的前几个元素是 s = "1221121221221121122……" 。如果将 s 中连续的若干 1 和 2 进行分组，可以得到 "1 22 11 2 1 22 1 22 11 2 11 22 ......" 。每组中 1 或者 2 的出现次数分别是 "1 2 2 1 1 2 1 2 2 1 2 2 ......" 。上面的出现次数正是 s 自身。

      // 给你一个整数 n ，返回在神奇字符串 s 的前 n 个数字中 1 的数目。

      //

      // 示例 1：

      // 输入：n = 6
      // 输出：3
      // 解释：神奇字符串 s 的前 6 个元素是 “122112”，它包含三个 1，因此返回 3 。
      // 示例 2：

      // 输入：n = 1
      // 输出：1
      //

      // 提示：

      // 1 <= n <= 105

      // 来源：力扣（LeetCode）
      // 链接：https://leetcode.cn/problems/magical-string
      // 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
      /**
       * @param {number} n
       * @return {number}
       */
      var magicalString = function (n) {
        const nums = new Array(n).fill(1)
        let res = 0,
          cur = 0,
          count = 1

        for (let i = 0; i < n; i++) {
          if (nums[i] === 1) res++

          nums[i + 1] = nums[i] === 2 ? 1 : 2
          if (nums[cur] === 2 && nums[i] !== nums[i - 1]) nums[i + 1] = nums[i]

          if (--count === 0) count = nums[++cur]
        }

        return res
      }
      console.log(magicalString(11))
    </script>
  </body>
</html>
